\documentclass[a4paper,10pt]{article}

%\usepackage[ansinew]{inputenc}
\usepackage[paperwidth=190mm,paperheight=290mm,left=3cm,top=3cm,right=3cm,bottom=3cm,head=3cm,includefoot]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{multicol}
\usepackage[final]{pdfpages}
\usepackage{listings}
\usepackage{verbatim}
\usepackage{fancyheadings}
\usepackage{lastpage}

\title{\textbf{TP Sistemas Operativos (75.08)}}
\author{}

\begin{document}
\pagestyle{fancy}
\lfoot{Grupo 09}
\rfoot{ P\'agina \thepage \hspace{0.5pt} de \pageref{LastPage}}
\cfoot{}

\includepdfmerge{
./enunciadoV.pdf, 1-2
}

\maketitle 
\thispagestyle{empty}   
\tableofcontents
\thispagestyle{empty}   % quita el n�mero en la primer p�gina

\newpage


%evita que se vayan del margen los textos importados}
\lstset{extendedchars=false,
		tabsize=4,
		basicstyle=\footnotesize,
		language=bash,
		showstringspaces=false,
		breaklines=true,
		breakatwhitespace=true,
		frame=single}


\section{Hipótesis y Aclaraciones Globales}

\section{Problemas relevantes}


\section{Archivo README}
\lstinputlisting{../README.TXT}

\newpage

\section{Listado de Comandos y Funciones}

\subsection{InstalaV5}
\subsubsection{Archivos de input, intermedios y output}
Este comando verifica que existan todos los archivos necesarios para la instalaci\'on, y de
acuerdo a lo que ingrese el usuario, se encarga de crear carpetas y mover los archivos
a dichas carpetas seg\'un la estructura definida para el trabajo practico. 
Los archivos deben encontrarse en el directorio actual, de lo contrario no se podra llevar a cabo la 
instalacion.\\
No se necesita la creación de archivos intermedios para el funcionamiento de este comando.\\

\subsubsection{Parámetros y Opciones}
Este comando no recibe parametros ni opciones, pero necesita que esten todos los archivos en la misma carpeta a la hora
de ejecutarse. Y de esta forma poder realizar correctamente la instalacion de los comandos.

\subsubsection{Invocación Manual y/o automática con ejemplos}
La invocación manual a esta comando la debe efectuar el usuario, luego de haber realizado los pasos que se indican en 
el README del tp (descompresion del archivo).\\

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
No hay aclaraciones para este comando.\\

\subsubsection{Código fuente}
\lstinputlisting{../grupo09/InstalaV5.sh}

\newpage

\subsection{IniciarV5}
\subsubsection{Archivos de input, intermedios y output}
Este comando toma el archivo de configuracion creado por el instalador, que se encuentra dentro del directorio confdir, cuya ubicación 
se busca a partir del directorio actual, subiendo hacia el directorio padre hasta llegar a la raiz.\\
Como output, informa el estado del sitema asi como los componentes existentes. Si se detecta algun error producido en la instalación
se informa el mismo y se termina con la inicialización. Asi mismo, si se produce algun error durante la inicialización, también se 
informa el mismo y se concluye el proceso.\\
No se necesita la creación de archivos intermedios para el funcionamiento de este comando.\\

\subsubsection{Parámetros y Opciones}
Este comando no recibe parametros ni opciones, pero necesita que este correctamente creado el archivo de configuración del sistema, 
del cual se obtendran todas las variables que se setearán como variables de ambiente para que las puedan utilizar los demas 
procesos del sistema.

\subsubsection{Invocación Manual y/o automática con ejemplos}
La invocación manual a esta comando la debe efectuar el usuario, con la precaución de que lo debe invocar como . ./IniciarV5.sh , para 
evitar que se pierdan las variables de ambiente luego de la finalizacion de este script. Luego de la primera invocacion no es 
necesario volver a invocarlo durante la misma sesión (y de hacerlo no tendrá efecto alguno).\\

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
Se tomará como hipotesis que las variables seteadas en el archivo de configuración tienen valores válidos y los directorios a los que
apuntan ya fueron correctamente creados.\\

\subsubsection{Código fuente}
\lstinputlisting{../grupo09/IniciarV5.sh}

\newpage


\subsection{DetectaV5}
\subsubsection{Archivos de input, intermedios y output}
Como input, este comando detecta el arribo de archivos en el directorio ARRIDIR, para luego realizar algunas validaciones sobre el 
nombre de cada archivo detectado. Además, utiliza el archivo maestro de sistemas para comprobar si los archivos detectados en ARRIDIR 
pertenecen a un sistema existente en dicho archivo maestro. \\
Como output, si un archivo pasa las validaciones efectuadas por este comando, es movido al directorio ACEPDIR, donde queda a 
disposición del siguiente paso, que es el BuscarV5. Si un archivo no pasa con dichas validaciones, se lo rechaza moviéndolo al 
directorio RECHDIR. Además este comando graba en el archivo de log.\\

\subsubsection{Parámetros y Opciones}
Este comando no recibe parámetros ni opciones. Solo necesita contar que las variables de entorno ARRIDIR, ACEPDIR, MAEDIR y RECHDIR 
tengan valores válidos, ya que son utilizadas en él.

\subsubsection{Invocación Manual y/o automática con ejemplos}
Este comando se invoca desde el comando IniciarV5. Luego de ello no es necesario volver a invocarlo ya que el demonio continúa 
ejecutándose de manera continua. Igualmente, si se invoca este comando y el demonio ya está corriendo, no se ejecutará una segunda 
instancia del demonio, sino que quedará ejecutándose la instancia original, sin tener efecto la segunda invocación.\\

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
Se toma como hipótesis que el archivo maestro de sistemas contiene datos válidos, es decir que cumplen con la descripción dada en 
el enunciado del trabajo práctico. Además, se asume que en las variables de entorno ARRIDIR, ACEPDIR, MAEDIR y RECHDIR encontraremos 
nombres de directorios existentes sobre los cuales es posible la lectura y escritura.\\
Este comando es un proceso de tipo demonio o daemon. Esto quiere decir que es un proceso no interactivo que se ejecuta en segundo 
plano de forma continua o infinita. \\

\subsubsection{Código fuente}
\lstinputlisting{../grupo09/DetectaV5.sh}

\newpage


\subsection{BuscarV5}
\subsubsection{Archivos de input, intermedios y output}
Este comando toma como input el archivo maestro de patrones cuya ubicación está definida por la variable de ambiente MAEDIR.
Toma además los archivos existentes en la carpeta cuya ubicación esta definida por ACEPDIR. Estos archivos fueron depositados
en esta carpeta previamente por DetectarV5.\\
Como output, si los archivos de la carpeta de aceptados no fueron procesados anteriormente, manda a mover los mismos a la carpeta
de procesados (ubicación definida por PROCDIR), agregando un ".0" al final del nombre de los mismos. Crea además en esta misma
ruta los archivos de resultados detallados y globales para cada patrón utilizado.\\
Si en cambio los archivos de la carpeta de aceptados ya fueron procesados previamente, envia estos a la carpeta de rechazados 
(ubicación definida por RECHDIR). Además este comando manda a grabar en el archivo de log.\\
No se necesita la creación de archivos intermedios para el funcionamiento de este comando.\\

\subsubsection{Parámetros y Opciones}
Este comando no recibe de forma directa parametros ni opciones. Con lo que si se debe contar es con las 
variables de entorno ACEPDIR, PROCDIR, MAEDIR Y RECHDIR que definen las rutas de los directorios utilizados por el comando.

\subsubsection{Invocación Manual y/o automática con ejemplos}
La invocación manual a este comando se efectua en DetectarV5. Si no habia otra instancia del
comando corriendo actualmente, se ejecuta el mismo. \\

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
Se tomará como hip\'otesis que los archivos que se encuentran en el directorio de aceptados ya fueron previamente comprobados y 
validados por DetectarV5. Además se contará con que los directorios tanto de aceptados, rechazados y procesados existen y 
es posible la lectura y/o escritura en los mismos.\\

\subsubsection{Código fuente}
\lstinputlisting{../grupo09/BuscarV5.sh}

\newpage

\subsection{ListarV5}
\subsubsection{Archivos de input, intermedios y output}
Este comando toma los archivos generados por el comando BuscaV5, luego de procesar los archivos de logueo.
Estos archivos: respuestas.NRO\_PATRON y rglobales.NRO\_PATRON, se encuentran dentro del directorio PROCDIR.\\
No se generan archivos intermedios, pero este comando permite la opcion -x que genera en un archivo el resultado
de la consulta realizada por el usuario. El directorio donde se guardan dichos archivos es REPODIR, en caso 
de no encontrarse resultados, no se genera el archivo.\\

\subsubsection{Parámetros y Opciones}
Este comando puede o no recibir opciones, a continuacion se muestra parte del help que 
muestra los distintos parametros y/o opciones aceptados por el comando:
Opciones:
\begin{itemize}
	\item[]-g:\\
		La consulta resolverá consultas sobre cantidad de hallazgos
		RGLOBALES.PAT\_ID
	\item[]-r:\\
		La consulta listará resultados extraídos de los archivos
		RESULTADOS.PAT\_ID
	\item[]-h:\\
		Muestra la ayuda.
	\item[]-x:\\
		Esta opción además de emitir por pantalla, grabar el informe 
		en el directorio REPODIR
\end{itemize}

\subsubsection{Invocación Manual y/o automática con ejemplos}
La invocación de este comando es unicamente manual, debe efectuarla el usuario cuando desea
realizar una consulta. Se debe tener en cuenta que para poder realizar correctamente la consulta 
se debio haber inicializado el ambiente previamente (ver comando {\bf IniciaV5}).\\
Ejemplos de uso:
\lstinputlisting{./modoUsoListar2.txt}
\lstinputlisting{./modoUsoListar.txt}

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
Se tomará como hip\'otesis que las variables seteadas en el archivo de configuración tienen valores válidos y los directorios a los que
apuntan ya fueron correctamente creados. Además cabe aclarar que este comando fue dividido
en dos archivos: ListarV5.pl (el comando propiamente dicho) y ListarUI.pl. Este segundo
archivo contiene todas las funciones de entrada/salida, es decir es la 'interfaz' con el usuario.
Esto se realizo de esta manera para no ensuciar el codigo perl que contiene la l\'ogica del ListarV5 
con las verificaciones correspondientes a entrada de texto e impresion por pantalla o archivo.\\
\newpage
\subsubsection{Código fuente}
\lstinputlisting{../grupo09/ListarV5.pl}
\lstinputlisting{../grupo09/ListarUI.pl}
\newpage


\subsection{StartD}
\subsubsection{Archivos de input, intermedios y output}
Este comando no utiliza archivos, simplemente es una función que permite disparar demonios. \\

\subsubsection{Parámetros y Opciones}
Este comando recibe un solo parámetro. Este parámetro es el nombre del proceso a disparar.\\

\subsubsection{Invocación Manual y/o automática con ejemplos}
Este comando se invoca desde el comando IniciarV5 para disparar el demonio DetectaV5.\\

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
Se toma como hipótesis que el nombre del proceso a iniciar es el nombre de un proceso existente.\\

\subsubsection{Código fuente}
\lstinputlisting{../grupo09/StartD.sh}

\newpage

\subsection{StopD}
\subsubsection{Archivos de input, intermedios y output}
Este comando no utiliza archivos, simplemente es una función que permite detener procesos. \\

\subsubsection{Parámetros y Opciones}
Este comando recibe un solo parámetro. Este parámetro es el nombre del proceso a detener.\\

\subsubsection{Invocación Manual y/o automática con ejemplos}
Este comando se invoca manualmente para detener un proceso.\\

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
Se toma como hip\'otesis que el nombre del proceso a detener es el nombre de un proceso existente.\\

\subsubsection{Código fuente}
\lstinputlisting{../grupo09/StopD.sh}

\newpage

\subsection{LoguearV5}
\subsubsection{Archivos de input, intermedios y output}
Este comando se encarga de loguear en los archivos que correspondan los mensajes 
que se llegan. Manipula 2 tipos de archivos, los de salida y uno intermedio (coderror.dat).
Los de salida tienen todos con el mismo formato (W5, ver {\bf Archivos}),
y su nombre depende del comando en si que esta logueando. En cuanto a coderror.dat, 
en este archivo se encuentran los mensaje de Error estandarizados, cuando el comando recibe
un mensaje del tipo E o SE y un codigo, reemplaza el codigo por su correspondiente mensaje
ubicado en dicho archivo.\\

\subsubsection{Parámetros y Opciones}
A continuación se muestra parte del help en el cual se pueden ver los par\'ametros y opciones
que tiene el comando.\\
Obligatorios:
\begin{itemize}
	\item[]-c [comando]: 
		Nombre del comando que loguea.
	\item[]-m [mensaje]: 
		Mensaje a loguear.
	\item[]-t [tipo]: 
		Tipo de mensaje a loguear: I (informacion), A (alerta), E (error), SE(error severo).
\end{itemize}
Opcionales:
\begin{itemize}
	\item[]-e [extension]: 
		Perminte cambiar la extension default de \_LOGFILE.
	\item[]-f [funcion]: 
		Nombre de la funcion que loguea, en caso de omicion se toma 
		el Comando como autor del mensaje a loguear.
	\item[]-h: 
		Muestra la ayuda.
	\item[]-s: 
		Muestra por pantalla el mensaje que debe loguear.
\end{itemize}

\subsubsection{Invocación Manual y/o automática con ejemplos}
Este comando se puede invocar en forma manual o automatica. En el sistema desarrollado, 
los comandos automaticamente si deben loguear, llaman al comando con los correspondientes
par\'ametros.
Ejemplo de uso:
LoguearV5.sh -c "DetectaV5" -m "Ya hay otra instancia de DetectaV5 corriendo" -t I \\

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
Este comando consta de una serie de valores default para la extencion, separador
de campos, direccion donde guardar los archivos, que permite ejecutarlo aun si no
fue inicializado el ambiente, de esta manera el comando InstalaV5 puede loguear 
sin mayores inconvenientes.\\

\subsubsection{Código fuente}
\lstinputlisting{../grupo09/LoguearV5.sh}

\newpage

\subsection{MirarV5}
\subsubsection{Archivos de input, intermedios y output}
Este comando maneja unicamente un tipo de archivo, los generados por el LoguearV5.
Mediante los par\'ametros de entrada determina que archivo debe leer y en base a 
ello y lo que el usuario pida, muestra por pantalla el resultado.\\

\subsubsection{Parámetros y Opciones}
A continuación se muestra parte del help en el cual se pueden ver los par\'ametros y opciones
que tiene el comando.\\
Par\'ametros: los par\'ametros son obligatorios
\begin{itemize}
	\item[] [comando]: 
		Nombre del comando del cual se desea mirar el Log.
\end{itemize}
Opciones:
\begin{itemize}
	\item[]-n [cantidad]: 
		Muestra los ultimos N registros de la busqueda realizada.
	\item[]-s [string]: 
		Muestra por los registros que contengan al string.
	\item[]-h: 
		Muestra la ayuda.
\end{itemize}

\subsubsection{Invocación Manual y/o automática con ejemplos}
Este comando se puede invocar en forma manual.\\
Ejemplo de uso:\\
\$ ./MirarV5.sh -n 3 ComandoFalso1 \\
\$ ./MirarV5.sh -s sistema ComandoFalso1 \\
\$ ./MirarV5.sh -n 3 -s sistema ComandoFalso1 \\

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
Al igual que varios de los otros comandos, la \'unica consireraci\'on pertinente
es que las rutas especificadas en las variables de ambiente existen. En cuanto a los 
archivos, el comando se encarga de emitir un mensaje de error por pantalla si no 
se encuentra.\\

\subsubsection{Código fuente}
\lstinputlisting{../grupo09/MirarV5.sh}

\newpage

\subsection{MoverV5}
\subsubsection{Archivos de input, intermedios y output}
Este comando maneja un archivo de entrada y uno de salida, en verdad ambos son 
el mismo, y lo que realiza el comando es moverlos de una carpeta a otra. Cabe tener
en cuenta que si en la nueva carpeta existe el archivo ya, el comando se encarga
de evitar la sobreescritura, cambiando el nombre del archivo.\\

\subsubsection{Parámetros y Opciones}
A continuación se muestra parte del help en el cual se pueden ver los par\'ametros y opciones
que tiene el comando.\\
Obligatorios:
\begin{itemize}
	\item[]-o [directorioOrigen/archivo]
		Archivo a mover,especificando la ruta del directorio donde se encuentra.
	\item[]-d [directorioDestino]
		Se especifica el directorio donde se mover el archivo.
\end{itemize}
Opcionales:
\begin{itemize}
	\item[]-c [comando]
		Comando que invoca la funcion"
	\item[]-h: 
		Muestra la ayuda.
\end{itemize}

\subsubsection{Invocación Manual y/o automática con ejemplos}
Este comando se puede invocar en forma manual, pero dentro del sistema los comandos
lo llaman de forma automarizada cuando requieren mover archivos de una carpeta a otra.\\
Ejemplo de uso:\\
\$ MoverV5.sh -c "DetectaV5" -o "\$ARRIDIR/\$2" -d "\$RECHDIR" \\

\subsubsection{Hipótesis y Aclaraciones especificas del comando}
Al igual que varios de los otros comandos, las rutas especificadas en las variables de ambiente 
se toman como existentes. Además, se omiten validaciones de espacio en disco, se asume 
que siempre hay espacio disponible para grabar archivo.\\

\subsubsection{Código fuente}
\lstinputlisting{../grupo09/MoverV5.sh}

\newpage

\section{Archivos}
\subsection{InstalaV5.conf}
Path definido por la variable de ambiente CONFDIR.\\

\begin{tabular*}{12 cm}{|l|l@{\extracolsep{\fill}}r|}
\hline
CAMPOS&DESCRIPCIÓN&FUENTE/VALOR\\
\hline
Variable&Caracteres & Valores posibles:\\
&&GRUPO, CONFDIR,\\
&&BINDIR,MAEDIR,ARRIDIR,\\
&&ACEPDIR,RECHDIR,\\
&&PROCDIR, REPODIR,\\
&&LOGDIR, LOGEXT, LOGSIZE,\\
&&DATASIZE,SECUENCIA1,\\
&&SECUENCIA2\\
\\
\hline
Valor&Caraceres&Contenido de la variable al\\&&momento de la grabación.
\\
\hline
Usuario&Caraceres&Es el login del usuario que\\&&graba el registro.
\\
\hline
Fecha&Fecha y hora&Es la fecha y hora en el momento\\&&de grabación del registro.
\\
\hline
\end{tabular*}

\subsection{$\<comando\>.logext$}
Path definido por la variable de ambiente LOGDIR.\\

\begin{tabular*}{12 cm}{|l|l@{\extracolsep{\fill}}r|}
\hline
CAMPOS&DESCRIPCIÓN&FUENTE/VALOR\\
\hline
Cuando&Fecha y hora& Es la fecha y hora en el momento\\
&&de grabación del registro.
\\
\hline
Quien&Caraceres&Es el login del usuario que graba\\&&el registro
\\
\hline
Donde&Caraceres&Nombre del Comando, función\\
&&o rutina en donde se produce el\\
&&evento que se registra en el log.
\\
\hline
Que&Caraceres&Lo determina el programador.\\
&&Valores posibles: I,A,E,SE
\\
\hline
Porque&Hasta 120 caracteres&Lo determina el programador.
\\
\hline
\end{tabular*}

\subsection{patrones}
Path definido por la variable de ambiente MAEDIR.\\

\begin{tabular*}{12 cm}{|l|l@{\extracolsep{\fill}}r|}
\hline
CAMPO&TIPO&VARIABLE\\
\hline
Id de patrón&Numérico&PAT\_ID
\\
\hline
Expresion regular&Caracteres&PAT\_EXP
\\
\hline
Código de sistema&numérico&SIS\_ID
\\
\hline
Contexto de resultado&1 caracter, L Á C&PAT\_CON
\\
\hline
Punto de partida de&Numérico&DESDE\\
aplicación del contexto&&
\\
\hline
Punto de fin de&Numérico&HASTA\\
aplicación del contexto&&\\
\hline
\end{tabular*}

\subsection{sistemas}
Path definido por la variable de ambiente MAEDIR.\\

\begin{tabular*}{12 cm}{|l|l@{\extracolsep{\fill}}r|}
\hline
CAMPO&TIPO&VARIABLE\\
\hline
Código de sistema&numérico&SIS\_ID
\\
\hline
Nombre del sistema&Caracteres&PAT\_NOM
\\
\hline
Fecha de alta&Fecha&SIS\_ALTA
\\
\hline
Fecha de baja&Fecha&SIS\_BAJA
\\
\hline
\end{tabular*}

\subsection{rglobales.PAT\_ID}
Path definido por la variable de ambiente PROCDIR.\\

\begin{tabular*}{10 cm}{|l|l@{\extracolsep{\fill}}r|}
\hline
CAMPO&FUENTE&\\
\hline
Ciclo de Búsqueda&SECUENCIA2&
\\
\hline
Nombre del archivo&Archivo procesado&
\\
\hline
Expresión regular&PAT\_CON&
\\
\hline
Contx de resultado&DESDE&
\\
\hline
Desde&HASTA&
\\
\hline
Hasta&HASTA&
\\
\hline
Cant de hallazgos&Valor procesado en la búsqueda.&
\\
\hline
\end{tabular*}

\subsection{resultados.PAT\_ID}
Path definido por la variable de ambiente PROCDIR.\\

\begin{tabular*}{10 cm}{|l|l@{\extracolsep{\fill}}r|}
\hline
CAMPO&FUENTE&\\
\hline
Ciclo de Búsqueda&SECUENCIA2&
\\
\hline
Nombre del archivo&Archivo procesado&
\\
\hline
Numero de registro&Archivo procesado&
\\
\hline
Resultado&Archivo procesado&
\\
\hline
\end{tabular*}

\subsection{coderror.dat}
Path definido por la variable de ambiente \$GRUPO. Es un archivo permanente, cuya
estructura es la siguiente:\\

\begin{tabular}{|c|c|}
\hline
CAMPO&TIPO\\
\hline
C\'odigo de error&Numérico\\
\hline
Mensaje de error&Caracteres\\
\hline
\end{tabular}

El separador del campo es ": ".\\

En dicho archivo se guardan los mensajes estandarizados de error, que son
utilizados por los distintos comandos para loguear mensajes del tipo E (error) y 
SE (error severo). El comando encargado de manipular este archivo es LoguearV5.

\newpage

\section{Apéndice A}
\includepdfmerge{
./enunciadoV.pdf, 3-32
}

\end{document}
